/*----------------------------------------------------------
* FILE: HibernateDaoFinder.java
* LOGICAL NAME: HibernateDaoFinder
* PRODUCT: bila-framework
*----------------------------------------------------------
* MODIFICATIONS
* DATE Aug 29, 2011
* AUTHOR wjuarez
*----------------------------------------------------------
*/

package bila.framework.dao.hibernate;

import bila.framework.dao.DaoFinder;

import java.io.Serializable;
import java.sql.Connection;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

/**
 * @author WJuarez
 * <b>Created by </b>wjuarez
 * <b>for</b> bila-framework
 * <b>package</b> bila.framework.dao.hibernate
 * <b>on</b> Aug 29, 2011 5:49:15 PM
 * <b>Purpose</b> 
 * <p>
 *		DAO generico para consultas utilizando Hibernate
 * </p>
 */
public interface HibernateDaoFinder<Model, ModelId extends Serializable> extends DaoFinder<Model, ModelId> {

	/**
	 * Crea una consulta utilizando el objeto criteria
	 * del framework hibernate. Para que dicho metodo funcione
	 * se debe crear el constructor de la clase y en este definir
	 * la clase modelo a utilizar en el DAO
	 * @param criteria objeto de tipo DetachedCriteria con los criterios de la consulta
	 * @return objeto de tipo List<Model> con los resultados
	 * @throws Exception
	 */
	public List<Model> findByCriteria(DetachedCriteria criteria) throws Exception;
	
	/**
	 * El metodo ejecuta flush de la transaccion para tener habilitados
	 * las operaciones que se haya efectuado en la base de datos. Sincronizando la 
	 * session de hibernate con la base de datos
	 * Por ejemplo.
	 * insert x
	 * insert y
	 * syncronize <-- Se efectuan los insert en la transaccion sin efectuar commit
	 * select x
	 * select y
	 * @throws Exception 
	 */
	public void sinchronyze() throws Exception;
	
	/**
	 * Crea un query utilizando el lenguaje HQL de Hibernate
	 * Se debe definir el query a ejecutar y los parametros a utilizar en este.
	 * Los parametros se definen a traves de ?
	 * @param hql query que se desea ejecutar
	 * @param params parametros del query
	 * @return objeto de tipo List<Model> con los datos recuperados
	 * @throws Exception
	 */
	public List<Model> findByHql(String hql, Object[] params) throws Exception;
	
	/**
	 * Devuelve un objeto java.sql.Connection con la conexion
	 * retomada de Hibernate-Spring
	 * @return conexion de la base de datos
	 * @throws Exception
	 */
	public Connection getConnection() throws Exception;
	
	/**
	 * Funcion que genera el correlativo de una tabla
	 * segun el hql y parametros que se le pasen
	 * Devuelve un objeto correspondiente al tipo del
	 * campo de la primaria
	 * @param hql objeto tipo String con el query para generar el correlativo
	 * @param params parametros del query
	 * @return tipo Object
	 * @throws Exception
	 */
	public Object getId(String hql, Object[] params) throws Exception;
	
}
